package com.hfzy.ihk.common.core.elasticsearch.repository.base;


import java.io.Serializable;
import java.util.Map;

/**
 * Created by Administrator on 2018/3/19.
 *
 * @author wws
 */
public interface CustomizedRepository<T,ID extends Serializable>{

    /**
     *添加一条数据到文档的List字段
     * 不存在冲突问题
     *
     * 能保证@version字段相应增加就行
     *
     * @param paramsValue 这个值注意要和表字段的类型匹配，不然报错
     *                    只支持这么多种类型：
     *                      type = 基础类型
    type = List.class;
    type = Object[].class;
    type = Map.class;
    type = ReadableInstant.class;
    type = BytesReference.class;
    type = value.getClass();

    对象类型：使用 JSON.toJSON(paramsValue)

     * @see com.alibaba.fastjson.JSON
     *
     *  支持乐观锁
     * */

    public void upsertEntityListFieldByScript(String dataId,
                                              Class entityClass,
                                              String updateFieldName, Object paramsValue,
                                              String versionFieldName, Long versionValue);

    @Deprecated
    void upsertEntityListFieldByScript(String dataId,
                                       Class entityClass,
                                       String updateFieldName,
                                       Object paramsValue);
    /**
     * version自动+1
     * 支持乐观锁
     * 注：
     * 1、无法更新字段是对象的字段
     * 2、字段是List的话，如果原先有类容，要带上，否则会丢失
     * */
    void updateSomeFields(String dataId,
                          Class entityClass,
                          Map<String, Object> fieldValueMap);

    /**
     * @param currentVersion 当前文档的版本
     * 更新时version自动+1
     * 支持乐观锁
     * */
    /*void updateSomeFields(String indexName,
                          String table,
                          String dataId,
                          Long currentVersion,
                          Class entityClass,
                          Map<String,Object> fieldValueMap) throws Exception;*/


    public Map<String,Object> getDataAsMap(String index, String type, String id);


    /*
    * 传入泛型对象进行更新，只更新对象中不为空的字段的值，为空的字段忽略
    * */
    public boolean updateSomeFieldsOnlyNotNull(T obj);

}
